package The07;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

/**
 * @Author XiaoKe
 * @Date 2020/4/28 22:24
 * @Description 用MethodHandle动态调用方法
 */
public class MethodHandleTest {

    // 定义一个类方法
    private static void hello() {
        System.out.println("hello");
    }
    // 定义一个实例方法
    private String hello(String name) {
        System.out.println("参数：" + name);
        return name + "你好";
    }

    public static void main(String[] args) throws Throwable {
        // 定义一个返回值为void，不带形参的方法类型
        MethodType type = MethodType.methodType(void.class);
        // 使用MethodHandles.Lookup的findStatic获取类方法
        MethodHandle mtd = MethodHandles.lookup()
                .findStatic(MethodHandleTest.class, "hello", type);
        // 通过MethodHandle执行方法
        mtd.invoke();

        //使用MethodHandles.Lookup的findVirtual获取实例方法
        MethodHandle mtd2 = MethodHandles.lookup()
                .findVirtual(MethodHandleTest.class, "hello",
                        MethodType.methodType(String.class, String.class));
        System.out.println(mtd2.invoke(new MethodHandleTest(), "许销坷"));
    }
}
